package com.json;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.pojo.Person;
import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JsonTest {
    //1、javaBean和json的转换
    @Test
    public void test1(){
        Person person = new Person(1,"张三");
        //1、创建gson对象实例
        Gson gson = new Gson();
        //javaBean转化为json
        //toJson()方法可以把java对象转为json字符串的形式
        String personJsonString = gson.toJson(person);
        System.out.println(personJsonString);

        //json字符串转化为javaBean
        //fromJson()方法把Json字符串转化为java对象，
        // 第一个参数是json字符串，第二个参数是转化回去的Java数据类型
        Person person1 = gson.fromJson(personJsonString, Person.class);
        System.out.println(person1);
    }
    //2、list和json的转换
    @Test
    public void test2(){
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1,"张三"));
        personList.add(new Person(2,"李四"));
        personList.add(new Person(3,"王五"));

        //1、创建gson实例
        Gson gson = new Gson();

        //把list集合转化为Json字符串
        String personLstJsonString = gson.toJson(personList);
        System.out.println(personLstJsonString);

        //把json字符串转化为list集合
            //创建一个类PersonListType，用于继承import com.google.gson.reflect.TypeToken; 泛型为<ArrayList<Person>>（所转化的list集合）
            //fromJson()方法中第一个参数为Json字符串，第二个参数为新建的PersonListType()的getType()方法（即获取类型）
        List<Person> list = gson.fromJson(personLstJsonString, new PersonListType().getType());
        System.out.println(list);
        Person person = list.get(0);
        System.out.println(person);
    }

    //3、map和json的转换
    @Test
    public void test3(){
        Map<Integer,Person> personMap = new HashMap<>();

        personMap.put(1,new Person(1,"张三"));
        personMap.put(2,new Person(2,"李四"));
        personMap.put(3,new Person(3,"王五"));

        Gson gson = new Gson();

        //将map集合转为json字符串
        String personMapJsonString = gson.toJson(personMap);
        System.out.println(personMapJsonString);

        //将json字符转化成为Map集合（方法与list相同）
        Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString,new TypeToken<HashMap<Integer,Person>>(){}.getType());
        System.out.println(personMap2);
        Person person = personMap2.get(2);
        System.out.println(person);
    }
}
